/* 
 * File:   main.c
 * Author: isen
 *
 * Created on 21 janvier 2014, 09:38
 */

#include <stdio.h>
#include <stdlib.h>
#include "esdl/esdl.h"	

// Prototypes	
void moveCallback(EsdlEvent* event);
void markerFocusCallback(EsdlEvent* event);
void markerBlurCallback(EsdlEvent* event);

// Fonction principale
int main(int argc, char* argv[]) {
    // Création de la fenête principale
    esdlCreateWindow("Tutorial 5 - Events basics", 800, 600);

    // Chargement de l'image
    EsdlSprite* marker = esdlLoadSpriteFromFile("marker.png");
    if (marker == NULL) {
        printf("Unable to load resources...\n");
        exit(1);
    }
    esdlSetSpritePosition(marker, 200, 200);

    // Enregistrement auprès d'événements
    esdlAddListenerOnKeyUp(marker, moveCallback);           // Lorsque l'on relache une touche du clavier alors que le marker à le focus, la fonction moveCallback est appelée
    esdlAddListenerOnFocus(marker, markerFocusCallback);    // Lorsque le marker obtient le focus (clique), la fonction markerFocusCallback est appelée
    esdlAddListenerOnBlur(marker, markerBlurCallback);      // Lorsque le marker perd le focus (clique), la fonction markerBlurCallback est appelée

    // Début du gestionnaire d'événement
    esdlEventLoop(NULL);

    // On quitte l'application
    esdlDeleteSprite(marker);
    esdlCloseWindow();
    return 0;
}

// Callback exécuté lorsqu'une touche du clavier est relevée
void moveCallback(EsdlEvent* event) {
    int dx = 0; // Gauche:-1 / Droite:1
    int dy = 0; // Haut:-1 / Bas:1
    int amplitude = 10; // Nombre de pixels par déplacement
    
    // On regarde quelle touche a été pressé (flèches directionelles)
    switch (esdlGetKey(event)) {
        case KEY_UP:
            dy = -1;
            break;
        case KEY_DOWN:
            dy = 1;
            break;
        case KEY_LEFT:
            dx = -1;
            break;
        case KEY_RIGHT:
            dx = 1;
            break;
        default:
            break;
    }
    
    // Déplacement du sprite
    EsdlSprite* sprite = esdlGetSpriteEvent(event);
    esdlSetSpritePosition(sprite, sprite->x + dx*amplitude, sprite->y + dy * amplitude);
}

// Callback exécuté lorsque l'image gagne le focus
void markerFocusCallback(EsdlEvent* event) {
    printf("\nExecution du callback onFocus pour l'image marker.png\n");
    printf("L'image a gagne le focus.\n");
    printf("Vous pouvez maintenant utiliser les fleches directionelles pour deplacer le marqueur\n");
}

// Callback exécuté lorsque l'image perd le focus
void markerBlurCallback(EsdlEvent* event) {
    printf("\nExecution du callback onBlur pour l'image marker.png\n");
    printf("L'image a perdu le focus.\n");
}

